package com.qf.petmall.starter.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @Author: 可乐
 * @Description:
 * @CreateTime: 2022-11-17  09:59
 */
@Configuration
public class RedisConfig {

	@Bean
	public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){

		final RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

		// 为 RedisTemplate 设置连接工厂对象
		redisTemplate.setConnectionFactory(lettuceConnectionFactory);

		// 指定key的序列化方式
		redisTemplate.setKeySerializer(new StringRedisSerializer());

		// 指定Redis String类型值的序列化方式
		final Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
		final ObjectMapper objectMapper = new ObjectMapper();
		// 开启json字符串自动类型推断，解决从Redis中取到的json为LinkedHashMap问题
		objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
		jsonRedisSerializer.setObjectMapper(objectMapper);
		redisTemplate.setValueSerializer(jsonRedisSerializer);

		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		redisTemplate.setHashValueSerializer(jsonRedisSerializer);

		return redisTemplate;
	}
}
